﻿using System;
using System.Linq;
using NHibernate;
using NHibernate.Linq;

namespace MoroMoro.Samples.ToDoList.Base.Persistence.NHibernate
{
    /// <summary>
    /// NHibernate を使用して実装されるリポジトリです。
    /// </summary>
    /// <typeparam name="TEntity">エンティティの型。</typeparam>
    /// <seealso cref="IRepository&lt;TEntity&gt;"/>
    /// <seealso cref="NWorkspace"/>
    internal sealed class NRepository<TEntity> : RepositoryBase<TEntity>
        where TEntity : class
    {
        /// <summary>
        /// <see cref="NRepository&lt;TEntity&gt;"/> クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="session">NHibernate セッション。</param>
        internal NRepository(ISession session)
        {
            if (session == null)
            {
                throw new ArgumentNullException("session");
            }
            _session = session;
        }


        /// <summary>
        /// NHibernate セッション。
        /// </summary>
        private readonly ISession _session;


        /// <inheritdoc/>
        protected override IQueryable<TEntity> CreateBaseQuery()
        {
            return _session.Query<TEntity>();
        }


        /// <inheritdoc/>
        public override void Add(TEntity target)
        {
            _session.Save(target);
        }

        /// <inheritdoc/>
        public override void Remove(TEntity target)
        {
            _session.Delete(target);
        }
    }
}
